<?php

namespace api\modules\v1\controllers\work;

use Yii;
use api\controllers\OnAuthController;
use common\helpers\CommonHelper;
use common\models\task\Task;
use services\task\TaskService;
use services\task\TaskRemindService;

class TaskController extends OnAuthController
{
    public $modelClass = Task::class;

    protected $optional = [];
    protected $optionalLimit = [];


    /**
     * @api {get} /v1/work/task/list 任务列表
     * @apiName list
     * @apiGroup WorkTask
     *
     * @apiParam {String} start_time                            创建开始时间【格式：2020-01-01】
     * @apiParam {String} end_time                              创建结束时间【格式：2020-01-01】
     * @apiParam {Number} status                                状态【''全部、0未开始、1进行中、2已延期、3已完成、4已关闭】
     * @apiParam {Number} page                                  页码
     * @apiParam {Number} pageSize                              每页显示数量
     *
     * @apiSuccess {Object}  data                               返回数据
     * @apiSuccess {Number}  data.page                          当前页码
     * @apiSuccess {Number}  data.pageSize                      每页显示数
     * @apiSuccess {Number}  data.total                         总数
     * @apiSuccess {Array}   data.list                          任务列表
     * @apiSuccess {Number}  data.list.id                       任务ID
     * @apiSuccess {Number}  data.list.project_id               项目ID
     * @apiSuccess {String}  data.list.title                    任务标题
     * @apiSuccess {String}  data.list.start_time_str           开始时间
     * @apiSuccess {String}  data.list.end_time_str             结束时间
     * @apiSuccess {Number}  data.list.callback_num             已回访人数
     * @apiSuccess {Number}  data.list.total_num                总人数
     * @apiSuccess {Number}  data.list.rate                     完成率【单位：%】
     * @apiSuccess {Array}   data.list.member_name_arr          任务人
     * @apiSuccess {Number}  data.list.status                   状态【0未开始、1进行中、2已延期、3已完成、4已关闭】
     * @apiSuccess {String}  data.list.status_str               状态值
     * @apiSuccess {String}  data.list.created_at_str           创建时间
     */
    public function actionList()
    {
        $params = Yii::$app->request->get();

        $page = $params['page'] ?? 1;
        $pageSize = $params['pageSize'] ?? 10;

        // 查询结果
        $service = new TaskService();
        $data = $service->getListPage($params, (int)$page, (int)$pageSize);

        return $data;
    }

    /**
     * @api {get} /v1/work/task/info 任务信息
     * @apiName info
     * @apiGroup WorkTask
     *
     * @apiParam {Number} id                                                任务ID
     *
     * @apiSuccess {Object}  data                                           返回数据
     * @apiSuccess {Number}  data.id                                        任务ID
     * @apiSuccess {Number}  data.project_id                                项目ID
     * @apiSuccess {String}  data.title                                     任务标题
     * @apiSuccess {String}  data.start_time                                开始时间
     * @apiSuccess {String}  data.end_time                                  结束时间
     * @apiSuccess {Number}  data.callback_num                              已回访人数
     * @apiSuccess {Number}  data.total_num                                 总人数
     * @apiSuccess {Number}  data.rate                                      完成率【单位：%】
     * @apiSuccess {Array}   data.member_name_arr                           任务人
     * @apiSuccess {Number}  data.status                                    状态【0未开始、1进行中、2已延期、3已完成、4已关闭】
     * @apiSuccess {String}  data.status_str                                状态值
     * @apiSuccess {String}  data.created_at_str                            创建时间
     * @apiSuccess {String}  data.remark                                    备注
     * @apiSuccess {Array}   data.select_condition                          筛选条件
     * @apiSuccess {String}  data.select_condition.start_reg_time           挂号【开始时间】
     * @apiSuccess {String}  data.select_condition.end_reg_time             挂号【结束时间】
     * @apiSuccess {String}  data.select_condition.start_last_callback_time 最后回访【开始时间】
     * @apiSuccess {String}  data.select_condition.end_last_callback_time   最后回访【结束时间】
     * @apiSuccess {Number}  data.select_condition.start_missed_days        未到天数【最小值】
     * @apiSuccess {Number}  data.select_condition.end_missed_days          未到天数【最大值】
     * @apiSuccess {Number}  data.select_condition.start_surplus_num        308剩余量【最小值】
     * @apiSuccess {Number}  data.select_condition.end_surplus_num          308剩余量【最大值】
     * @apiSuccess {Array}   data.select_condition.outpatient_name_arr      就诊类型
     * @apiSuccess {Array}   data.select_condition.tag_name_arr             标签
     * @apiSuccess {Array}   data.select_condition.diseases_name_arr        病种
     * @apiSuccess {String}  data.select_condition.is_anti_relapse          是否为抗复发【1是、0否(全部)】
     * @apiSuccess {Array}   data.operate_log_list                          操作日志
     * @apiSuccess {Number}  data.operate_log_list.id                       日志ID
     * @apiSuccess {Number}  data.operate_log_list.task_id                  任务ID
     * @apiSuccess {String}  data.operate_log_list.content                  内容
     * @apiSuccess {String}  data.operate_log_list.type_str                 类型值
     * @apiSuccess {String}  data.operate_log_list.realname                 操作人姓名
     * @apiSuccess {String}  data.operate_log_list.profession_name          岗位
     * @apiSuccess {String}  data.operate_log_list.created_at_str           创建时间
     * @apiSuccess {Number}  data.is_edit_op                                编辑【1是、0否】
     * @apiSuccess {Number}  data.is_close_op                               关闭【1是、0否】
     * @apiSuccess {Number}  data.is_delete_op                              删除【1是、0否】
     */
    public function actionInfo()
    {
        $params = Yii::$app->request->get();

        $id = $params['id'] ?? 0;

        // 查询结果
        $service = new TaskService();
        $data = $service->getInfo((int)$id);

        return $data;
    }

    /**
     * @api {get} /v1/work/task/edit-info 新增/编辑获取任务信息
     * @apiName edit-info
     * @apiGroup WorkTask
     *
     * @apiParam {Number} id                                                任务ID【新增传0】
     *
     * @apiSuccess {Object}  data                                           返回数据
     * @apiSuccess {Number}  data.id                                        任务ID
     * @apiSuccess {Number}  data.project_id                                项目ID
     * @apiSuccess {String}  data.title                                     任务标题
     * @apiSuccess {String}  data.start_time                                开始时间
     * @apiSuccess {String}  data.end_time                                  结束时间
     * @apiSuccess {Number}  data.total_num                                 总人数
     * @apiSuccess {Array}   data.member_id_arr                             任务人
     * @apiSuccess {String}  data.remark                                    备注
     * @apiSuccess {Array}   data.select_condition                          患者筛选条件
     * @apiSuccess {String}  data.select_condition.start_reg_time           挂号【开始时间】
     * @apiSuccess {String}  data.select_condition.end_reg_time             挂号【结束时间】
     * @apiSuccess {String}  data.select_condition.start_last_callback_time 最后回访【开始时间】
     * @apiSuccess {String}  data.select_condition.end_last_callback_time   最后回访【结束时间】
     * @apiSuccess {Number}  data.select_condition.start_missed_days        未到天数【最小值】
     * @apiSuccess {Number}  data.select_condition.end_missed_days          未到天数【最大值】
     * @apiSuccess {Number}  data.select_condition.start_surplus_num        308剩余量【最小值】
     * @apiSuccess {Number}  data.select_condition.end_surplus_num          308剩余量【最大值】
     * @apiSuccess {Array}   data.select_condition.outpatient_type_ids      就诊类型
     * @apiSuccess {Array}   data.select_condition.tag_ids                  标签
     * @apiSuccess {Array}   data.select_condition.patient_diseases_ids     病种
     * @apiSuccess {String}  data.select_condition.is_anti_relapse          是否为抗复发【1是、0否(全部)】
     * @apiSuccess {Array}   data.condition                                 筛选条件
     * @apiSuccess {Array}   data.condition.tags_list                       标签
     * @apiSuccess {Array}   data.condition.outpatient_type_list            就诊类型列表
     * @apiSuccess {Array}   data.condition.patient_diseases_list           病种列表
     * @apiSuccess {Array}   data.condition.member_list                     归属人列表
     */
    public function actionEditInfo()
    {
        $params = Yii::$app->request->get();

        $id = $params['id'] ?? 0;

        // 查询结果
        $service = new TaskService();
        $data = $service->getEditInfo((int)$id);

        return $data;
    }

    /**
     * @api {get} /v1/work/task/patient-res 筛选任务患者信息
     * @apiName patient-res
     * @apiGroup WorkTask
     *
     * @apiParam {String}  start_reg_time                                   挂号【开始时间】
     * @apiParam {String}  end_reg_time                                     挂号【结束时间】
     * @apiParam {String}  start_last_callback_time                         最后回访【开始时间】
     * @apiParam {String}  end_last_callback_time                           最后回访【结束时间】
     * @apiParam {Number}  start_missed_days                                未到天数【最小值】
     * @apiParam {Number}  end_missed_days                                  未到天数【最大值】
     * @apiParam {Number}  start_surplus_num                                308剩余量【最小值】
     * @apiParam {Number}  end_surplus_num                                  308剩余量【最大值】
     * @apiParam {String}  outpatient_type_ids                              就诊类型【多个用','分割】
     * @apiParam {String}  tag_ids                                          标签【多个用','分割】
     * @apiParam {String}  patient_diseases_ids                             病种【多个用','分割】
     * @apiParam {String}  is_anti_relapse                                  是否为抗复发【1是、0否(全部)】
     *
     * @apiSuccess {Object}  data                                           返回数据
     * @apiSuccess {Number}  data.total                                     总数
     */
    public function actionPatientRes()
    {
        $params = Yii::$app->request->get();

        // 查询结果
        $service = new TaskService();
        $data = $service->selectTaskPatientList($params, 1);

        return $data;
    }

    /**
     * @api {get} /v1/work/task/remind-info 任务提醒信息
     * @apiName remind-info
     * @apiGroup WorkTask
     *
     * @apiParam {String}  id                                               任务ID
     *
     * @apiSuccess {Object}  data                                           返回数据
     * @apiSuccess {Number}  data.task_id                                   任务ID
     * @apiSuccess {String}  data.access_token                              钉钉access_token
     * @apiSuccess {String}  data.secret                                    钉钉secret
     * @apiSuccess {Object}  data.content                                   提醒内容【格式{1: ''}】
     */
    public function actionRemindInfo()
    {
        $params = Yii::$app->request->get();
        $params['id'] = $params['id'] ?? 0;

        // 查询结果
        $service = new TaskRemindService();
        $data = $service->getInfo((int)$params['id']);

        return $data;
    }

    /**
     * @api {get} /v1/work/task/my-list 我的任务列表【工作台】
     * @apiName my-list
     * @apiGroup WorkTask
     *
     * @apiParam {Number} status                                状态【0未开始、1进行中、2已延期、3已完成、4已关闭】
     * @apiParam {Number} page                                  页码
     * @apiParam {Number} pageSize                              每页显示数量
     *
     * @apiSuccess {Object}  data                               返回数据
     * @apiSuccess {Number}  data.page                          当前页码
     * @apiSuccess {Number}  data.pageSize                      每页显示数
     * @apiSuccess {Number}  data.total                         总数
     * @apiSuccess {Array}   data.list                          任务列表
     * @apiSuccess {Number}  data.list.id                       任务ID
     * @apiSuccess {Number}  data.list.project_id               项目ID
     * @apiSuccess {String}  data.list.title                    任务标题
     * @apiSuccess {String}  data.list.start_time_str           开始时间
     * @apiSuccess {String}  data.list.end_time_str             结束时间
     * @apiSuccess {Number}  data.list.callback_num             已回访人数
     * @apiSuccess {Number}  data.list.total_num                总人数
     * @apiSuccess {Number}  data.list.rate                     完成率【单位：%】
     * @apiSuccess {Array}   data.list.member_name_arr          任务人
     * @apiSuccess {Number}  data.list.status                   状态【0未开始、1进行中、2已延期、3已完成、4已关闭】
     * @apiSuccess {String}  data.list.status_str               状态值
     * @apiSuccess {String}  data.list.created_at_str           创建时间
     * @apiSuccess {Object}  data.patient_list                  任务患者首页列表【同v1/work/task/patient-list返回数据类型】
     */
    public function actionMyList()
    {
        $params = Yii::$app->request->get();
        $params['status'] = $params['status'] ?? Task::STATUS_WAIT;

//        $page = $params['page'] ?? 1;
//        $pageSize = $params['pageSize'] ?? 10;
        $page = 0;
        $pageSize = 0;

        // 查询结果
        $service = new TaskService();
        $data = $service->getMyList($params, (int)$page, (int)$pageSize);

        return $data;
    }

    /**
     * @api {get} /v1/work/task/my-list-total 任务数tab统计【工作台】
     * @apiName my-list-total
     * @apiGroup WorkTask
     *
     *
     * @apiSuccess {Object}  data                               返回数据
     * @apiSuccess {Number}  data.wait                          未开始数
     * @apiSuccess {Number}  data.start                         进行中数
     * @apiSuccess {Number}  data.delay                         已延迟数
     * @apiSuccess {Number}  data.success                       已完成数
     * @apiSuccess {Number}  data.close                         已关闭数
     */
    public function actionMyListTotal()
    {
        $params = Yii::$app->request->get();

        // 查询结果
        $service = new TaskService();
        $data = $service->getTaskTotalList(null);

        return $data;
    }

    /**
     * @api {get} /v1/work/task/patient-list 任务患者列表【工作台】
     * @apiName patient-list
     * @apiGroup WorkTask
     *
     * @apiParam {Number} task_id                                   任务ID
     * @apiParam {Number} belong_member_id                          归属人
     * @apiParam {String} start_last_revisiting_time                上次到诊开始时间
     * @apiParam {String} end_last_revisiting_time                  上次到诊结束时间
     * @apiParam {String} keywords                                  关键词【姓名or手机号】
     * @apiParam {Number} outpatient_type_id                        就诊类型ID
     * @apiParam {Number} page                                      页码
     * @apiParam {Number} pageSize                                  每页显示数量
     *
     * @apiSuccess {Object}  data                                   返回数据
     * @apiSuccess {Number}  data.page                              当前页码
     * @apiSuccess {Number}  data.pageSize                          每页显示数
     * @apiSuccess {Number}  data.total                             总数
     * @apiSuccess {Array}   data.list                              患者列表
     * @apiSuccess {Number}  data.list.id                           患者ID
     * @apiSuccess {Number}  data.list.project_id                   项目ID
     * @apiSuccess {String}  data.list.name                         患者姓名
     * @apiSuccess {Number}  data.list.age                          患者年龄
     * @apiSuccess {Number}  data.list.gender                       患者性别
     * @apiSuccess {String}  data.list.gender_str                   患者性别值
     * @apiSuccess {String}  data.list.patient_card_id              诊疗号
     * @apiSuccess {String}  data.list.clinic_name                  诊室名称
     * @apiSuccess {String}  data.list.mobile                       手机号
     * @apiSuccess {String}  data.list.last_revisiting_time_str     上次到诊时间
     * @apiSuccess {String}  data.list.next_revisiting_time_str     下次到诊时间
     * @apiSuccess {String}  data.list.last_callback_time_str       上次回访时间
     * @apiSuccess {String}  data.list.next_callback_time_str       下次回访时间
     * @apiSuccess {Number}  data.list.outpatient_type_id           就诊类型ID
     * @apiSuccess {String}  data.list.outpatient_name              就诊类型值
     * @apiSuccess {Array}   data.list.patient_tags_name_arr        患者标签数组
     * @apiSuccess {Number}  data.list.revisiting_count             复诊次数
     * @apiSuccess {Number}  data.list.callback_count               回访次数
     * @apiSuccess {Number}  data.list.missed_count                 未到诊天数
     * @apiSuccess {String}  data.list.city_name                    地区
     * @apiSuccess {Number}  data.list.source_channel_id            来源ID
     * @apiSuccess {String}  data.list.source_name                  来源值
     * @apiSuccess {String}  data.list.remark                       备注
     * @apiSuccess {Number}  data.list.fault_diagnosis_count        断诊次数
     * @apiSuccess {String}  data.list.diseases_name                病种
     * @apiSuccess {Array}   data.condition                         筛选条件
     * @apiSuccess {Array}   data.condition.member_list             归属人
     * @apiSuccess {Array}   data.condition.outpatient_type_list    就诊类型
     */
    public function actionPatientList()
    {
        $params = Yii::$app->request->get();
        $taskId = $params['task_id'] ?? 0;

        $page = $params['page'] ?? 1;
        $pageSize = $params['pageSize'] ?? 10;

        // 查询结果
        $service = new TaskService();
        $data = $service->getTaskPatientList($params, (int)$page, (int)$pageSize, (int)$taskId);

        return $data;
    }

    /**
     * @api {post} /v1/work/task/create 新增任务
     * @apiName create
     * @apiGroup WorkTask
     *
     * @apiParam {String}  title                                            标题
     * @apiParam {String}  remark                                           备注
     * @apiParam {String}  start_time                                       任务【开始时间】
     * @apiParam {String}  end_time                                         任务【结束时间】
     * @apiParam {String}  member_ids                                       任务人【多个用','分割】
     * @apiParam {String}  start_reg_time                                   挂号【开始时间】
     * @apiParam {String}  end_reg_time                                     挂号【结束时间】
     * @apiParam {String}  start_last_callback_time                         最后回访【开始时间】
     * @apiParam {String}  end_last_callback_time                           最后回访【结束时间】
     * @apiParam {Number}  start_missed_days                                未到天数【最小值】
     * @apiParam {Number}  end_missed_days                                  未到天数【最大值】
     * @apiParam {Number}  start_surplus_num                                308剩余量【最小值】
     * @apiParam {Number}  end_surplus_num                                  308剩余量【最大值】
     * @apiParam {String}  outpatient_type_ids                              就诊类型【多个用','分割】
     * @apiParam {String}  tag_ids                                          标签【多个用','分割】
     * @apiParam {String}  patient_diseases_ids                             病种【多个用','分割】
     * @apiParam {String}  is_anti_relapse                                  是否为抗复发【1是、0否(全部)】
     *
     * @apiSuccess {Object} data                                            返回内容
     * @apiSuccess {Number} data.id                                         任务ID
     */
    public function actionCreateTask()
    {
        try {
            $params = $this->post;

            // 检验选择参数
            $service = new TaskService();
            $service->checkPatientCondition($params);

            // 根据筛选统计患者IDs
            $patientData = $service->selectTaskPatientList($params);
            $params['patient_ids'] = array_column($patientData['list'], 'id');

            $transaction = Yii::$app->db->beginTransaction();

            $data = $service->create($params);

            $transaction->commit();
        } catch (\Exception $e) {
            $transaction->rollBack();

            $data = CommonHelper::api(422, $e->getMessage());
        }

        return $data;
    }

    /**
     * @api {post} /v1/work/task/update 编辑任务
     * @apiName update
     * @apiGroup WorkTask
     *
     * @apiParam {Number}  id                                               任务ID
     * @apiParam {String}  title                                            标题
     * @apiParam {String}  remark                                           备注
     * @apiParam {String}  start_time                                       任务【开始时间】
     * @apiParam {String}  end_time                                         任务【结束时间】
     * @apiParam {String}  member_ids                                       任务人【多个用','分割】
     * @apiParam {String}  start_reg_time                                   挂号【开始时间】
     * @apiParam {String}  end_reg_time                                     挂号【结束时间】
     * @apiParam {String}  start_last_callback_time                         最后回访【开始时间】
     * @apiParam {String}  end_last_callback_time                           最后回访【结束时间】
     * @apiParam {Number}  start_missed_days                                未到天数【最小值】
     * @apiParam {Number}  end_missed_days                                  未到天数【最大值】
     * @apiParam {Number}  start_surplus_num                                308剩余量【最小值】
     * @apiParam {Number}  end_surplus_num                                  308剩余量【最大值】
     * @apiParam {String}  outpatient_type_ids                              就诊类型【多个用','分割】
     * @apiParam {String}  tag_ids                                          标签【多个用','分割】
     * @apiParam {String}  patient_diseases_ids                             病种【多个用','分割】
     * @apiParam {String}  is_anti_relapse                                  是否为抗复发【1是、0否(全部)】
     *
     * @apiSuccess {Object} data                                            返回内容
     * @apiSuccess {Number} data.id                                         任务ID
     */
    public function actionUpdateTask()
    {
        try {
            $params = $this->post;
            $params['id'] = intval($params['id'] ?? 0);

            // 检验选择参数
            $service = new TaskService();
            $service->checkPatientCondition($params);

            // 根据筛选统计患者IDs
            $patientData = $service->selectTaskPatientList($params);
            $params['patient_ids'] = array_column($patientData['list'], 'id');

            $transaction = Yii::$app->db->beginTransaction();

            $data = $service->edit($params);

            $transaction->commit();
        } catch (\Exception $e) {
            $transaction->rollBack();

            $data = CommonHelper::api(422, $e->getMessage());
        }

        return $data;
    }

    /**
     * @api {post} /v1/work/task/close 关闭任务
     * @apiName close
     * @apiGroup WorkTask
     *
     * @apiParam {Number}  id               任务ID
     * @apiParam {String}  reason           关闭原因
     *
     * @apiSuccess {Object} data            返回内容
     * @apiSuccess {Number} data.id         任务ID
     */
    public function actionClose()
    {
        $isSuccess = 1;
        try {
            $params = $this->post;
            $params['id'] = intval($params['id'] ?? 0);

            $transaction = Yii::$app->db->beginTransaction();

            $service = new TaskService();
            $data = $service->close($params);

            $transaction->commit();
        } catch (\Exception $e) {
            $transaction->rollBack();
            $isSuccess = 0;
            $data = CommonHelper::api(422, $e->getMessage());
        }

        if ($isSuccess) {
            $res = $service->taskRemind($params['id'], Task::STATUS_CLOSE);
            $data['send_status'] = $res;
        }

        return $data;
    }

    /**
     * @api {post} /v1/work/task/delete 删除任务
     * @apiName delete
     * @apiGroup WorkTask
     *
     * @apiParam {Number}  id               任务ID
     *
     * @apiSuccess {Object} data            返回内容
     * @apiSuccess {Number} data.id         任务ID
     */
    public function actionDeleteTask()
    {
        try {
            $params = $this->post;
            $params['id'] = intval($params['id'] ?? 0);

            $transaction = Yii::$app->db->beginTransaction();

            $service = new TaskService();
            $data = $service->delete($params);

            $transaction->commit();
        } catch (\Exception $e) {
            $transaction->rollBack();

            $data = CommonHelper::throwRes($e);
        }

        return $data;
    }

    /**
     * @api {post} /v1/work/task/remind 设置任务提醒
     * @apiName remind
     * @apiGroup WorkTask
     *
     * @apiParam {Number}  id               任务ID
     * @apiParam {String}  access_token     钉钉token
     * @apiParam {String}  secret           钉钉secret
     * @apiParam {Json}    content          提醒内容【格式：{1: '', 2: ''}  任务状态：提醒内容】
     *
     * @apiSuccess {Object} data            返回内容
     * @apiSuccess {Number} data.id         任务ID
     */
    public function actionRemind()
    {
        try {
            $params = $this->post;
            $params['id'] = intval($params['id'] ?? 0);

            $transaction = Yii::$app->db->beginTransaction();

            $service = new TaskService();
            $data = $service->remind($params);

            $transaction->commit();
        } catch (\Exception $e) {
            $transaction->rollBack();

            $data = CommonHelper::api(422, $e->getMessage());
        }

        return $data;
    }

}
